package com.comenjoysoft.baselibrary.util;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.text.TextUtils;

import androidx.annotation.RequiresPermission;

import com.comenjoysoft.baselibrary.base.BaseApplication;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import static android.Manifest.permission.CALL_PHONE;
import static android.Manifest.permission.READ_PHONE_STATE;

class PhoneUtils {
    private PhoneUtils() {
        throw new UnsupportedOperationException("u can't instantiate me...");
    }

    /**
     * Return whether the device is phone.
     *
     * @return {@code true}: yes<br>{@code false}: no
     */
    //    public static boolean isPhone() {
    //        TelephonyManager tm = getTelephonyManager();
    //        return tm.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE;
    //    }

    /**
     * Return the unique device id.
     * <p>If the version of SDK is greater than 28, it will return an empty string.</p>
     * <p>Must hold {@code <uses-permission android:name="android.permission.READ_PHONE_STATE" />}</p>
     *
     * @return the unique device id
     */
    //    @SuppressLint("HardwareIds")
    //    @RequiresPermission(READ_PHONE_STATE)
    //    public static String getDeviceId() {
    //        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    //            return "";
    //        }
    //        TelephonyManager tm = getTelephonyManager();
    //        String deviceId = tm.getDeviceId();
    //        if (!TextUtils.isEmpty(deviceId)) return deviceId;
    //        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    //            String imei = tm.getImei();
    //            if (!TextUtils.isEmpty(imei)) return imei;
    //            String meid = tm.getMeid();
    //            return TextUtils.isEmpty(meid) ? "" : meid;
    //        }
    //        return "";
    //    }

    /**
     * Return the serial of device.
     *
     * @return the serial of device
     */
    @SuppressLint("HardwareIds")
    @RequiresPermission(READ_PHONE_STATE)
    public static String getSerial() {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? Build.getSerial() : Build.SERIAL;
    }



    //    /**
    //     * Return the IMEI.
    //     * <p>If the version of SDK is greater than 28, it will return an empty string.</p>
    //     * <p>Must hold {@code <uses-permission android:name="android.permission.READ_PHONE_STATE" />}</p>
    //     *
    //     * @return the IMEI
    //     */
    //    @RequiresPermission(READ_PHONE_STATE)
    //    public static String getIMEI() {
    //        return getImeiOrMeid(true);
    //    }

//    /**
//     * Return the MEID.
//     * <p>If the version of SDK is greater than 28, it will return an empty string.</p>
//     * <p>Must hold {@code <uses-permission android:name="android.permission.READ_PHONE_STATE" />}</p>
//     *
//     * @return the MEID
//     */
//    @RequiresPermission(READ_PHONE_STATE)
//    public static String getMEID() {
//        return getImeiOrMeid(false);
//    }

    //    @SuppressLint("HardwareIds")
    //    @RequiresPermission(READ_PHONE_STATE)
    //    public static String getImeiOrMeid(boolean isImei) {
    //        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    //            return "";
    //        }
    //        TelephonyManager tm = getTelephonyManager();
    //        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    //            if (isImei) {
    //                return getMinOne(tm.getImei(0), tm.getImei(1));
    //            } else {
    //                return getMinOne(tm.getMeid(0), tm.getMeid(1));
    //            }
    //        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    //            String ids = getSystemPropertyByReflect(isImei ? "ril.gsm.imei" : "ril.cdma.meid");
    //            if (!TextUtils.isEmpty(ids)) {
    //                String[] idArr = ids.split(",");
    //                if (idArr.length == 2) {
    //                    return getMinOne(idArr[0], idArr[1]);
    //                } else {
    //                    return idArr[0];
    //                }
    //            }
    //
    //            String id0 = tm.getDeviceId();
    //            String id1 = "";
    //            try {
    //                Method method = tm.getClass().getMethod("getDeviceId", int.class);
    //                id1 = (String) method.invoke(tm,
    //                        isImei ? TelephonyManager.PHONE_TYPE_GSM
    //                                : TelephonyManager.PHONE_TYPE_CDMA);
    //            } catch (NoSuchMethodException e) {
    //                e.printStackTrace();
    //            } catch (IllegalAccessException e) {
    //                e.printStackTrace();
    //            } catch (InvocationTargetException e) {
    //                e.printStackTrace();
    //            }
    //            if (isImei) {
    //                if (id0 != null && id0.length() < 15) {
    //                    id0 = "";
    //                }
    //                if (id1 != null && id1.length() < 15) {
    //                    id1 = "";
    //                }
    //            } else {
    //                if (id0 != null && id0.length() == 14) {
    //                    id0 = "";
    //                }
    //                if (id1 != null && id1.length() == 14) {
    //                    id1 = "";
    //                }
    //            }
    //            return getMinOne(id0, id1);
    //        } else {
    //            String deviceId = tm.getDeviceId();
    //            if (isImei) {
    //                if (deviceId != null && deviceId.length() >= 15) {
    //                    return deviceId;
    //                }
    //            } else {
    //                if (deviceId != null && deviceId.length() == 14) {
    //                    return deviceId;
    //                }
    //            }
    //        }
    //        return "";
    //    }

//    private static String getMinOne(String s0, String s1) {
//        boolean empty0 = TextUtils.isEmpty(s0);
//        boolean empty1 = TextUtils.isEmpty(s1);
//        if (empty0 && empty1)
//            return "";
//        if (!empty0 && !empty1) {
//            if (s0.compareTo(s1) <= 0) {
//                return s0;
//            } else {
//                return s1;
//            }
//        }
//        if (!empty0)
//            return s0;
//        return s1;
//    }
//
//    private static String getSystemPropertyByReflect(String key) {
//        try {
//            @SuppressLint("PrivateApi")
//            Class<?> clz = Class.forName("android.os.SystemProperties");
//            Method getMethod = clz.getMethod("get", String.class, String.class);
//            return (String) getMethod.invoke(clz, key, "");
//        } catch (Exception e) {/**/}
//        return "";
//    }

    /**
     * Return the IMSI.
     * <p>Must hold {@code <uses-permission android:name="android.permission.READ_PHONE_STATE" />}</p>
     *
     * @return the IMSI
     */
    //    @SuppressLint("HardwareIds")
    //    @RequiresPermission(READ_PHONE_STATE)
    //    public static String getIMSI() {
    //        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    //            try {
    //                getTelephonyManager().getSubscriberId();
    //            } catch (SecurityException e) {
    //                e.printStackTrace();
    //                return "";
    //            }
    //        }
    //        return getTelephonyManager().getSubscriberId();
    //    }
    //

    /**
     * Returns the current phone type.
     *
     * @return the current phone type
     * <ul>
     * <li>{@link TelephonyManager#PHONE_TYPE_NONE}</li>
     * <li>{@link TelephonyManager#PHONE_TYPE_GSM }</li>
     * <li>{@link TelephonyManager#PHONE_TYPE_CDMA}</li>
     * <li>{@link TelephonyManager#PHONE_TYPE_SIP }</li>
     * </ul>
     */
    public static int getPhoneType() {
        TelephonyManager tm = getTelephonyManager();
        return tm.getPhoneType();
    }
    //
    //    /**
    //     * Return whether sim card state is ready.
    //     *
    //     * @return {@code true}: yes<br>{@code false}: no
    //     */
    //    public static boolean isSimCardReady() {
    //        TelephonyManager tm = getTelephonyManager();
    //        return tm.getSimState() == TelephonyManager.SIM_STATE_READY;
    //    }
    //
    //    /**
    //     * Return the sim operator name.
    //     *
    //     * @return the sim operator name
    //     */
    //    public static String getSimOperatorName() {
    //        TelephonyManager tm = getTelephonyManager();
    //        return tm.getSimOperatorName();
    //    }

    /**
     * Return the sim operator using mnc.
     *
     * @return the sim operator
     */
    //    public static String getSimOperatorByMnc() {
    //        TelephonyManager tm = getTelephonyManager();
    //        String operator = tm.getSimOperator();
    //        if (operator == null) return "";
    //        switch (operator) {
    //            case "46000":
    //            case "46002":
    //            case "46007":
    //            case "46020":
    //                return "中国移动";
    //            case "46001":
    //            case "46006":
    //            case "46009":
    //                return "中国联通";
    //            case "46003":
    //            case "46005":
    //            case "46011":
    //                return "中国电信";
    //            default:
    //                return operator;
    //        }
    //    }

    /**
     * Skip to dial.
     *
     * @param phoneNumber The phone number.
     */
    public static void dial(final String phoneNumber) {
        //        Utils.getApp().startActivity(UtilsBridge.getDialIntent(phoneNumber));
    }

    /**
     * Make a phone call.
     * <p>Must hold {@code <uses-permission android:name="android.permission.CALL_PHONE" />}</p>
     *
     * @param phoneNumber The phone number.
     */
    @RequiresPermission(CALL_PHONE)
    public static void call(final String phoneNumber) {
        //        Utils.getApp().startActivity(UtilsBridge.getCallIntent(phoneNumber));
    }

    /**
     * Send sms.
     *
     * @param phoneNumber The phone number.
     * @param content     The content.
     */
    public static void sendSms(final String phoneNumber, final String content) {
        //        Utils.getApp().startActivity(UtilsBridge.getSendSmsIntent(phoneNumber, content));
    }

    private static TelephonyManager getTelephonyManager() {
        return (TelephonyManager) BaseApplication.getInstance().getSystemService(Context.TELEPHONY_SERVICE);
    }
}
